#!/usr/bin/env python
# encoding: utf-8


"""
@file: triangle_structs.py
@time: 2017/5/10 下午3:26
"""


# 三角形用到的一些数据结构

# 三角知识元结构.主要用于解三角形的自动推导的一个结构
# 输入输出都是BaseEq 也就是说一个TriangleKnowledgeElement只对应的一个知识点的转换
# labels都是一些知识元标签
# steps都是一些转换步骤
# 这些知识元构成一个树状结构，树状结构表达了一个推理过程
# 每一个节点都有输入 但是不一定有输出，有一些节点只是作为上一个阶段和下一个阶段的承接，所以输入和输出是相同的
class TriangleKnowledgeElement(object):
    def __init__(self, known_input, output=None, steps=None, lables=None, kids=None, parent=None):
        self.input = known_input  # 输入
        self.output = output  # 输出
        self.lables = lables if lables else []  # 标签
        self.steps = steps if steps else []  # 变换步骤
        self.kids = kids if kids else []  # 子节点
        self.parent = parent  # 父节点。如果父节点为None那么 它就是一个单独的节点或者是一个父节点

    def add_kid(self, e):
        """
        添加一个子节点
        :param e: 
        :return: 
        """
        if isinstance(e, TriangleKnowledgeElement):
            self.kids.append(e)
        else:
            raise Exception('Illegal type')

    def get_parent(self):
        """
        父节点
        :return: 
        """
        return self.parent

    def add_label(self, label):
        """
        添加标签
        :param label: 
        :return: 
        """
        self.lables.append(label)

    def get_labels(self):
        return self.lables

    def add_step(self, step):
        """
        添加一个步骤
        :param step: 
        :return: 
        """
        self.steps.append(step)

    def get_steps(self):
        return self.steps

    def set_output(self, output):
        """
        设置输出结果
        :param output: 
        :return: 
        """
        self.output = output

    def get_output(self):
        return self.output

    def get_input(self):
        return self.input

    def set_parent(self, parent):
        self.parent = parent


# 动作函数
class ActionFunc(object):
    def __init__(self, lables=None, steps=None):
        self.labels = lables if lables else []
        self.steps = steps if steps else []

    def add_label(self, label):
        """
        添加标签
        :param label: 
        :return: 
        """
        self.labels.append(label)

    def get_labels(self):
        return self.labels

    def add_step(self, step):
        """
        添加步骤
        :param step: 
        :return: 
        """
        self.steps.append(step)

    def get_steps(self):
        return self.steps
